<?php
/**
 * 策略模式
 * User: Yan
 * Date: 2018/7/5
 * Time: 12:02
 */

namespace Yan;

# 传统做法 这样如果有很多页面的话 需要写很多if else   如果使用策略模式 只要在实例化的时候判断用户 然后使用对应的策略即可
/*
$user = '用户信息';
$goods = "默认推荐商品";

if ( $user['area'] == '广东' ) {
    $goods = "推荐降温神器";
} elseif( $user['area'] == '东北') {
    $goods = "推荐保暖神器";
}

echo $goods;
*/

/**
 * Class Page
 * 假设这是一个控制器，一个商城的首页，需要在首页根据用户的地区来决定显示的推荐商品
 * @property Strategy strategy
 * @package Yan
 */
class Page
{
    protected $strategy;

    /**
     * 构造函数
     * 第一步根据用户设置策略
     * @param $user
     */
    public function __construct($user)
    {
        switch ($user) {
            case '广东':
                $this->setUserStrategy(new GDStrategy);
                break;

            case '东北':
                $this->setUserStrategy(new DBStrategy);
                break;

            default:
                $this->setUserStrategy(new DefaultStrategy);
                break;
        }
    }

    /**
     * 设置用户策略
     * @param Strategy $strategy
     */
    public function setUserStrategy(Strategy $strategy)
    {
        $this->strategy = $strategy;
    }

    /**
     * 首页入口
     */
    public function idnex()
    {
        echo $this->strategy->getGoods();
    }

    /**
     * 第二个页面的入口
     */
    public function index2()
    {
        echo $this->strategy->getGoods();
    }

}
# 这里的传参 在实际中应该是由url参数或者根据用户的ip来决定
$page = new Page('广东');
$page->idnex();

/**
 * Class Strategy
 * 抽象类 策略 规定每一个策略需要实现的
 * @package Yan
 */
abstract class Strategy
{
    /**
     * 获得推荐商品信息
     * @return mixed
     */
    abstract function getGoods();
}

/**
 * Class GDStrategy
 * 广东策略类
 * @package Yan
 */
class GDStrategy extends Strategy
{

    /**
     * 获得推荐商品信息
     * @return mixed
     */
    function getGoods()
    {
        echo "推荐降温神器";
    }
}

/**
 * Class GDStrategy
 * 东北策略类
 * @package Yan
 */
class DBStrategy extends Strategy
{

    /**
     * 获得推荐商品信息
     * @return mixed
     */
    function getGoods()
    {
        echo "推荐保暖神器";
    }
}

/**
 * Class GDStrategy
 * 默认策略类
 * @package Yan
 */
class DefaultStrategy extends Strategy
{

    /**
     * 获得推荐商品信息
     * @return mixed
     */
    function getGoods()
    {
        echo "默认推荐商品";
    }
}